<?php
/**
 * @param $object
 * @return mixed
 * 深拷贝
 */
function deepCopy($object) {
    return unserialize(serialize($object));
}
/**
 * @param $bytes
 * @return float|int
 * 字节数转兆字节
 */
function bytesToMB($bytes)
{
    return $bytes / (1024 * 1024);
}

/**
 * [makeCode 随机字符串]
 * @param  integer $length [随机数长度]
 * @return [type]          [返回一个指定长度的字符串]
 */

function make_sms_code($length = 5)
{
    // 密码字符集，可任意添加你需要的字符
    $chars = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
    // 在 $chars 中随机取 $length 个数组元素键名
    $keys = array_rand($chars, $length);
    $code = '';
    for ($i = 0; $i < $length; $i++) {
        // 将 $length 个数组元素连接成字符串
        $code .= $chars[$keys[$i]];
    }
    return $code;
}

/**
 * 只保留字符串首尾字符，隐藏中间用*代替（两个字符时只显示第一个）
 * @param string $user_name 姓名
 * @return string 格式化后的姓名
 */
function substr_cut($user_name){
    $strlen     = mb_strlen($user_name, 'utf-8');
    if (1 == $strlen) return $user_name;
    $firstStr     = mb_substr($user_name, 0, 1, 'utf-8');
    $lastStr     = mb_substr($user_name, -1, 1, 'utf-8');
    return $strlen == 2 ? $firstStr . str_repeat('*', mb_strlen($user_name, 'utf-8') - 1) : $firstStr . str_repeat("*", $strlen - 2) . $lastStr;
}

/** curl 获取 https 请求
 * @param String $url        请求的url
 * @param object  $data       要發送的数据
 * @param Array  $header     请求时发送的header
 * @param int    $timeout    超时时间，默认30s
 * @param $cookie     		cookie
 * @param $returnCookie      是否返回cookie
 */
function curl_https($url, $data=array(), $header=array(), $method = "POST", $timeout=30, $cookie='', $returnCookie=0){

    $thisHeader = array(
        'Content-Type: application/json',
        'Content-Length: ' . strlen($data)
    );
    $ch = curl_init();
    // 跳过证书检查
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    // 从证书中检查SSL加密算法是否存在
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    //使用一个自定义的请求信息来代替"GET"或"HEAD"作为HTTP请求。这对于执行"DELETE" 或者其他更隐蔽的HTTP请求。有效值如"GET"，"POST"，"CONNECT"等等。也就是说，不要在这里输入整个HTTP请求。例如输入"GET /index.html HTTP/1.0 "是不正确的。
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
    //需要获取的URL地址，也可以在curl_init()函数中设置。
    curl_setopt($ch, CURLOPT_URL, $url);
    //curl请求参数设置时,CURLOPT_HTTPHEADER设置 HTTP 头字段的数组。
    curl_setopt($ch, CURLOPT_HTTPHEADER, $thisHeader);
    //启用时会发送一个常规的POST请求，类型为：application/x-www-form-urlencoded，就像表单提交的一样。
    curl_setopt($ch, CURLOPT_POST, true);
    //全部数据使用HTTP协议中的"POST"操作来发送。要发送文件，在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串类似'para1=val1&para2=val2&...'或使用一个以字段名为键值，字段数据为值的数组。如果value是一个数组，Content-Type头将会被设置成multipart/form-data。
    //curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    //因header设置了application/json在入参已经转json
    $curl=$ch;
    if($method == "POST") {
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
    }else{
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }
    if($cookie) {
        curl_setopt($curl, CURLOPT_COOKIE, $cookie);
    }
    //设置cURL允许执行的最长秒数。
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    //HTTP请求头中"Accept-Encoding: "的值。支持的编码有"identity"，"deflate"和"gzip"。如果为空字符串""，请求头会发送所有支持的编码类型
    curl_setopt($ch, CURLOPT_ENCODING, '');
    //将curl_exec()获取的信息以文件流的形式返回，而不是直接输出。
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //指定最多的HTTP重定向的数量，这个选项是和CURLOPT_FOLLOWLOCATION一起使用的
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
    //启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器，使用CURLOPT_MAXREDIRS可以限定递归返回的数量
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    //CURL_HTTP_VERSION_NONE (默认值，让cURL自己判断使用哪个版本)，CURL_HTTP_VERSION_1_0 (强制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1 (强制使用 HTTP/1.1)。
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    $response = curl_exec($ch);
    if($error=curl_error($ch)){
        die($error);
    }
    curl_close($ch);
    if($returnCookie){
        list($header, $body) = explode("\r\n\r\n", $response , 2);
        preg_match_all("/Set\-Cookie:([^;]*);/", $header, $matches);
        $info['cookie']  = substr($matches[1][0], 1);
        $info['content'] = $body;
        return $info;
    }
    return $response;
}

